// jdbcsh - An interactive shell for JDBC databases
// Copyright (C) 2007 Dan Boitnott
//
// This program is free software; you can redistribute it and/or
// modify it under the terms of the GNU General Public License
// as published by the Free Software Foundation; either version 2
// of the License, or (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.

package jdbcsh;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Types;

/**
 *
 * @author Dan Boitnott
 */
public class DescTable extends PreloadTable {

    private class DescTranslateTable implements Table {

        private ResultSet res;

        public DescTranslateTable(ResultSet r) {
            res = r;
        }

        public int getColumnCount() {
            return 3;
        }

        public int getColumnDisplaySize(int column) {
            try {
                return res.getMetaData().getColumnDisplaySize(column);
            } catch (SQLException ex) {
                throw new RuntimeException(ex);
            }
        }

        public String getColumnLabel(int column) {
            switch (column) {
            case 0:
                return "column";
            case 1:
                return "type";
            case 2:
                return "modifiers";
            }
            return "";
        }

        public String getString(int column) {
            try {
                switch (column) {
                case 0:
                    return res.getString("COLUMN_NAME");
                case 1:
                    switch (res.getInt("DATA_TYPE")) {
                    case Types.CHAR:
                    case Types.VARCHAR:
                        return res.getString("TYPE_NAME") + "(" + res.getString("COLUMN_SIZE") + ")";
                    default:
                        return res.getString("TYPE_NAME");
                    }
                case 2:
                    // Get the columns default value
                    String v = "default " + res.getString("COLUMN_DEF");
                    if (res.wasNull()) {
                        v = "";
                    }

                    // Is the column "not null"
                    if (res.getString("IS_NULLABLE").equals("NO")) {
                        v = "not null " + v;
                    }

                    return v;
                default:
                    return null;
                }
            } catch (SQLException ex) {
                throw new RuntimeException(ex);
            }
        }

        public boolean next() {
            try {
                return res.next();
            } catch (SQLException ex) {
                throw new RuntimeException(ex);
            }
        }
    }
    
    public DescTable(ResultSet res) {
        super();
        setTable(new DescTranslateTable(res));
    }    
}
